﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Framework.Entidade.Acesso;
using Framework.LogicaNegocio.Acesso;
using Framework.Util;
using Framework.Util.Enumerador;

namespace Web
{
    public partial class ListarFuncionalidades : System.Web.UI.Page
    {
        #region Métodos

        private void ExibirMensagem(string mensagem, TipoMensagemEnum tipoMensagem)
        {
            ucMensagem.Mensagem = mensagem;
            ucMensagem.TipoMensagem = tipoMensagem;
            ucMensagem.ExibirMensagem();
        }

        private void ExibirMensagemPopUp(string mensagem, TipoMensagemEnum tipoMensagem)
        {
            ucMensagemUP.Mensagem = mensagem;
            ucMensagemUP.TipoMensagem = tipoMensagem;
            ucMensagemUP.ExibirMensagem();
        }

        private void IniciarTela()
        {
            try
            {
                ucCabecalho.TelaDestino = "~/Admin/Acesso/ListarFuncionalidades.aspx";
                ucCabecalho.CarregarCabecalho();

                CarregarStatus();
                CarregarListView();

                CarregarFuncionalidadePai();
                CarregarTipo();
            }
            catch (Exception ex)
            {
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }
        }

        private void CarregarStatus()
        {
            try
            {
                Array lstValues = Enum.GetValues(typeof(StatusEnum));
                List<string> lstNames = Geral.GetDescriptions(typeof(StatusEnum));

                if (lstValues.Length == lstNames.Count)
                {
                    ListItem item;
                    for (int i = 0; i < lstValues.Length; i++)
                    {
                        item = new ListItem();
                        item.Text = lstNames[i];
                        item.Value = lstValues.GetValue(i).ToString();

                        rblStatus.Items.Add(item);
                    }

                    rblStatus.DataBind();
                    rblStatus.Items[0].Selected = true;
                }
            }
            catch (Exception ex)
            {
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }
        }

        private void CarregarListView()
        {
            ucMensagem.FecharMensagem();

            LN_Funcionalidade ojFuncionalidadeLN = new LN_Funcionalidade();

            try
            {
                ltvFuncionalidade.DataSource = ojFuncionalidadeLN.Listar(0, txtTitulo.Text.Trim(), rblStatus.SelectedValue.ToString());
                ltvFuncionalidade.DataBind();
            }
            catch (Exception ex)
            {
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }
        }

        private void ExcluirFuncionalidade(int id)
        {
            LN_Funcionalidade ojFuncionalidadeLN = new LN_Funcionalidade();

            try
            {
                ojFuncionalidadeLN.Excluir(id);
            }
            catch (Exception ex)
            {
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }
        }

        private void LimparFormulario()
        {
            lblIdPU.Text = "0";
            ddlFuncPaiPU.SelectedIndex = 0;
            txtTituloPU.Text = string.Empty;
            txtDescricaoPU.Text = string.Empty;
            txtResumoPU.Text = string.Empty;
            txtDestinoPU.Text = string.Empty;
            ddlTipoPU.SelectedIndex = 0;
            txtCorPU.Text = string.Empty;
            txtOrdemPU.Text = string.Empty;
        }

        private void CarregarFuncionalidadePai()
        {
            LN_Funcionalidade ojFuncionalidadeLN = new LN_Funcionalidade();

            try
            {
                ddlFuncPaiPU.DataSource = ojFuncionalidadeLN.Listar(0, string.Empty, StatusEnum.A.ToString());
                ddlFuncPaiPU.DataBind();

                ddlFuncPaiPU.Items.Insert(0, new ListItem("-- SELECIONE --", "0"));
            }
            catch (Exception ex)
            {
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }
        }

        private void CarregarTipo()
        {
            try
            {
                Array lstValues = Enum.GetValues(typeof(TipoFuncionalidadeEnum));
                List<string> lstNames = Framework.Util.Geral.GetDescriptions(typeof(TipoFuncionalidadeEnum));

                if (lstValues.Length == lstNames.Count)
                {
                    ListItem item;
                    for (int i = 0; i < lstValues.Length; i++)
                    {
                        item = new ListItem();
                        item.Text = lstNames[i];
                        item.Value = lstValues.GetValue(i).ToString();

                        ddlTipoPU.Items.Add(item);
                    }

                    ddlTipoPU.DataBind();
                }


                ddlTipoPU.Items.Insert(0, new ListItem("-- SELECIONE --", string.Empty));
            }
            catch (Exception ex)
            {
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }
        }

        private bool ValidarCampos()
        {
            bool valida = true;

            if (string.IsNullOrEmpty(txtTituloPU.Text) == true)
            {
                ExibirMensagemPopUp("Título é obrigatório!", TipoMensagemEnum.Erro);
                valida = false;
                mpeFuncionalidade.Show();
            }
            else if (string.IsNullOrEmpty(txtDescricaoPU.Text) == true)
            {
                ExibirMensagemPopUp("Descrição é obrigatória!", TipoMensagemEnum.Erro);
                valida = false;
                mpeFuncionalidade.Show();
            }
            else if (string.IsNullOrEmpty(txtResumoPU.Text) == true)
            {
                ExibirMensagemPopUp("Resumo é obrigatório!", TipoMensagemEnum.Erro);
                valida = false;
                mpeFuncionalidade.Show();
            }
            else if (string.IsNullOrEmpty(ddlTipoPU.SelectedValue) == true)
            {
                ExibirMensagemPopUp("Tipo é obrigatório!", TipoMensagemEnum.Erro);
                valida = false;
                mpeFuncionalidade.Show();
            }
            else if (string.IsNullOrEmpty(txtDestinoPU.Text) == true)
            {
                ExibirMensagemPopUp("Destino é obrigatório!", TipoMensagemEnum.Erro);
                valida = false;
                mpeFuncionalidade.Show();
            }
            else if (string.IsNullOrEmpty(txtCorPU.Text) == true)
            {
                ExibirMensagemPopUp("Cor é obrigatória!", TipoMensagemEnum.Erro);
                valida = false;
                mpeFuncionalidade.Show();
            }
            else if (string.IsNullOrEmpty(txtOrdemPU.Text) == true)
            {
                ExibirMensagemPopUp("Ordem é obrigatório!", TipoMensagemEnum.Erro);
                valida = false;
                mpeFuncionalidade.Show();
            }

            return valida;
        }

        private void CarregarCampos(EN_Funcionalidade objFuncionalidade)
        {
            try
            {
                ucMensagem.FecharMensagem();
                ucMensagemUP.FecharMensagem();

                lblIdPU.Text = objFuncionalidade.Id.ToString();
                ddlFuncPaiPU.SelectedValue = objFuncionalidade.IdPai.ToString();
                txtTituloPU.Text = objFuncionalidade.Titulo;
                txtDescricaoPU.Text = objFuncionalidade.Descricao;
                txtResumoPU.Text = HttpUtility.HtmlDecode(objFuncionalidade.Resumo);
                txtDestinoPU.Text = objFuncionalidade.Destino;
                ddlTipoPU.SelectedValue = objFuncionalidade.Tipo;
                txtCorPU.Text = objFuncionalidade.CorMenu;
                txtOrdemPU.Text = objFuncionalidade.Ordem.ToString();
            }
            catch (Exception ex)
            {
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }
        }

        private void Salvar()
        {
            try
            {
                if (ValidarCampos() == true)
                {
                    LN_Funcionalidade objFuncionalidadeLN = new LN_Funcionalidade();
                    EN_Funcionalidade objFuncionalidade = new EN_Funcionalidade();

                    objFuncionalidade.Id = Convert.ToInt32(lblIdPU.Text);
                    objFuncionalidade.IdPai = Convert.ToInt32(ddlFuncPaiPU.SelectedValue);
                    objFuncionalidade.Titulo = txtTituloPU.Text;
                    objFuncionalidade.Descricao = txtDescricaoPU.Text;
                    objFuncionalidade.Resumo = txtResumoPU.Text;
                    objFuncionalidade.Destino = txtDestinoPU.Text;
                    objFuncionalidade.Tipo = ddlTipoPU.SelectedValue;
                    objFuncionalidade.CorMenu = txtCorPU.Text;
                    objFuncionalidade.Ordem = Convert.ToInt32(txtOrdemPU.Text);
                    objFuncionalidade.Status = true;

                    objFuncionalidadeLN.Salvar(objFuncionalidade);

                    LimparFormulario();
                    mpeFuncionalidade.Hide();

                    CarregarListView();
                    CarregarFuncionalidadePai();

                    if (lblIdPU.Text != "0")
                        ExibirMensagem("Funcionalidade alterada com sucesso.", TipoMensagemEnum.Sucesso);
                    else
                        ExibirMensagem("Funcionalidade cadastrada com sucesso.", TipoMensagemEnum.Sucesso);
                }
            }
            catch (Exception ex)
            {
                LimparFormulario();
                mpeFuncionalidade.Hide();
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }
        }

        #endregion

        #region Eventos

        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack == true) return;

            IniciarTela();
        }

        protected void btnPesquisar_Click(object sender, EventArgs e)
        {
            CarregarListView();
        }

        #region PopUp

        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            Salvar();
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            LimparFormulario();
            mpeFuncionalidade.Hide();
        }

        #endregion

        #region ltvFuncionalidade

        protected void ltvFuncionalidade_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            try
            {
                Label lblStatus = e.Item.FindControl("lblStatus") as Label;
                Image imgStatus = e.Item.FindControl("imgStatus") as Image;

                Label lblFuncPai = e.Item.FindControl("lblFuncPai") as Label;

                if (imgStatus != null && lblStatus != null && lblFuncPai != null)
                {
                    bool status = Convert.ToBoolean(lblStatus.Text);

                    if (status == true)
                    {
                        imgStatus.ImageUrl = "~/Images/iconAtivo.png";
                        imgStatus.ToolTip = "Ativo";
                    }
                    else
                    {
                        imgStatus.ImageUrl = "~/Images/iconInativo.png";
                        imgStatus.ToolTip = "Inativo";
                    }

                    LN_Funcionalidade objFuncionalidadeLN = new LN_Funcionalidade();
                    EN_Funcionalidade objFuncionalidade = new EN_Funcionalidade();

                    int idPai = Convert.ToInt32(lblFuncPai.Text);

                    if (idPai > 0)
                    {
                        objFuncionalidade = objFuncionalidadeLN.RetornarFuncionalidade(idPai, string.Empty);

                        if (objFuncionalidade != null)
                            lblFuncPai.Text = objFuncionalidade.Titulo;
                    }
                    else
                        lblFuncPai.Text = "PRINCIPAL";
                }
            }
            catch (Exception ex)
            {
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }
        }

        protected void ltvFuncionalidade_ItemDeleting(object sender, ListViewDeleteEventArgs e)
        {
            try
            {
                int index = e.ItemIndex;
                int id = 0;

                ListViewDataItem li = (ListViewDataItem)ltvFuncionalidade.Items[index];
                Label lblId = (Label)li.FindControl("lblId");

                if (lblId != null)
                    id = Convert.ToInt32(lblId.Text);

                ExcluirFuncionalidade(id);
                CarregarListView();
                ExibirMensagem("Funcionalidade excluída com sucesso.", TipoMensagemEnum.Sucesso);
            }
            catch (Exception ex)
            {
                ExibirMensagem(ex.Message, TipoMensagemEnum.Erro);
            }
        }

        protected void ltvFuncionalidade_ItemEditing(object sender, ListViewEditEventArgs e)
        {
            int index = e.NewEditIndex;
            ListViewDataItem item = (ListViewDataItem)ltvFuncionalidade.Items[index];
            Label lblId = item.FindControl("lblId") as Label;

            if (lblId != null)
            {
                LN_Funcionalidade objFuncionalidadeLN = new LN_Funcionalidade();
                EN_Funcionalidade objFuncionalidade = objFuncionalidadeLN.RetornarFuncionalidade(Convert.ToInt32(lblId.Text), string.Empty);

                if (objFuncionalidade != null)
                {
                    CarregarCampos(objFuncionalidade);
                    mpeFuncionalidade.Show();
                }
            }
        }

        #endregion

        #endregion
    }
}